package top.psjj.news.utils;

/**
 * @Auther:小陈的Java
 */

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * 数据源工具类
 */
public class DataSourceUtils {
    //将本地线程绑定连接
    private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
    private static DataSource dataSource;
    private static Properties properties;
    static {
        try {
            //读取配置文件
            properties = new Properties();
            properties.load(DataSourceUtils.class.getClassLoader().getResourceAsStream("db.properties"));
            //创建数据源
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static DataSource getDataSource(){
        return dataSource;
    }
    /*
     * 封装取连接方法：
     *       1.从本地线程中取连接，没有从连接池取出一个连接，绑定到本地线程，有直接返回。
     * */
    public static Connection getConnection(){
        Connection connection = null;
        try {
            //从本地线程取出一个连接
            connection = threadLocal.get();
            if(connection==null){
                //如果连接为null，从连接池取出一个连接，并绑定到本地线程中
                connection = dataSource.getConnection();
                threadLocal.set(connection);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return connection;
    }

    //开启事物
    public static void startTransaction(){
        try {
            //开启事物，让内存上的数据不自动刷到磁盘
            getConnection().setAutoCommit(false);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    //提交事物
    public static void commit(){
        try {
            //提交事物，内存的数据刷到磁盘
            getConnection().commit();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    //回滚事物
    public static void rollback(){
        try {
            //将内存数据恢复到开启事物状态或保存点。
            getConnection().rollback();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        System.out.println(DataSourceUtils.getDataSource().getConnection());
    }
}
